bitkeeper revision 1.1159.231.9 (41f97c50Eg32TPmD9lVOyWCldhbhDA)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 27 Jan 2005 23:42:08 +0000 (23:42 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 27 Jan 2005 23:42:08 +0000 (23:42 +0000)
Some guests depend on getting a #GP fault in order to boot. This patch
makes sure that the GP fault is injected into the guest properly.

Signed-off-by: Arun Sharma <arun.sharma@intel.com>
Signed-off-by: ian.pratt@cl.cam.ac.uk
xen/arch/x86/vmx.c

index f69002f4ed9126fd74191be58f9ecb8c22fdcac7..194311242b3fcac10484990066b0f737488c0d0c 100644 (file)
@@ -41,6 +41,11 @@ unsigned int opt_vmx_debug_level;
 extern long evtchn_send(int lport);
 extern long do_block(void);
 
+#define VECTOR_DB   1
+#define VECTOR_BP   3
+#define VECTOR_GP   13
+#define VECTOR_PG   14
+
 int start_vmx()
 {
     struct vmcs_struct *vmcs;
@@ -142,19 +147,26 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code)
 static void vmx_do_general_protection_fault(struct xen_regs *regs) 
 {
     unsigned long eip, error_code;
+    unsigned long intr_fields;
 
     __vmread(GUEST_EIP, &eip);
     __vmread(VM_EXIT_INTR_ERROR_CODE, &error_code);
 
-    VMX_DBG_LOG(DBG_LEVEL_1, 
+    VMX_DBG_LOG(DBG_LEVEL_1,
             "vmx_general_protection_fault: eip = %lx, erro_code = %lx\n",
             eip, error_code);
 
-    VMX_DBG_LOG(DBG_LEVEL_1, 
+    VMX_DBG_LOG(DBG_LEVEL_1,
             "eax=%x, ebx=%x, ecx=%x, edx=%x, esi=%x, edi=%x\n",
             regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi);
 
-    __vmx_bug(regs);
+    /* Reflect it back into the guest */
+    intr_fields = (INTR_INFO_VALID_MASK | 
+                  INTR_TYPE_EXCEPTION |
+                  INTR_INFO_DELIEVER_CODE_MASK |
+                  VECTOR_GP);
+    __vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields);
+    __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
 }
 
 static void vmx_vmexit_do_cpuid(unsigned long input, struct xen_regs *regs) 
@@ -725,11 +737,6 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs)
     switch (exit_reason) {
     case EXIT_REASON_EXCEPTION_NMI:
     {
-#define VECTOR_DB   1
-#define VECTOR_BP   3
-#define VECTOR_GP   13
-#define VECTOR_PG   14
-
         /*
          * We don't set the software-interrupt exiting (INT n). 
          * (1) We can get an exception (e.g. #PG) in the guest, or